﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace INSTA.Exercices.Events
{
    /// <summary>
    /// Représente une voiture.
    /// </summary>
    public class Car
    {
        // On déclare notre event "SpeedChanged" qui aura pour signature :
                // - (object sender, SpeedChangedEventArgs e)
        public event EventHandler<SpeedChangedEventArgs> SpeedChanged;

        private int _speed;

        /// <summary>
        /// Gets or sets the speed.
        /// </summary>
        public int Speed
        {
            get { return _speed; }
            set
            {
                // On récupère la vitesse avant changement..
                int lastSpeed = _speed;

                // On change la vitesse.
                _speed = value;

                // On récupère la vitesse après changement..
                int currentSpeed = _speed;
                
                // On construit l'objet qui contient les infos 
                // de l'event..
                var args = new SpeedChangedEventArgs(lastSpeed,
                                                     currentSpeed,
                                                     GetHashCode());

                //// même ligne avec la syntaxe "object initalizer"..
                //var args2 = new SpeedChangedEventArgs()
                //               {
                //                   ActualSpeed = currentSpeed,
                //                   PreviousSpeed = lastSpeed,
                //                   HashCode = GetHashCode()
                //               };
                               

                // On appelle la méthode qui déclenche notre event..
                OnSpeedChanged(args);
            }
        }

        protected virtual void OnSpeedChanged(SpeedChangedEventArgs e)
        {
            // On vérifie qu'il y a au moins une méthode abonnée
            // à notre event.
            if (SpeedChanged != null)
            {
                // Et l'on déclenche l'event.
                SpeedChanged(this, e);
            }
        }


        /// <summary>
        /// Accelerates the car's speed by the specified KMH.
        /// </summary>
        /// <param name="kmh">The KMH.</param>
        public void Accelerate(int kmh)
        {
            Speed += kmh;

        }

        /// <summary>
        /// Brakes the car's speed by the specified KMH.
        /// </summary>
        /// <param name="kmh">The KMH.</param>
        public void Brake(int kmh)
        {
            Speed -= kmh;
        }


    }
}
